package uy.org.softtech.cssuite.webservices.servicios;

import static org.springframework.util.Assert.notNull;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

import org.apache.log4j.Logger;
import org.springframework.ws.server.endpoint.annotation.Endpoint;
import org.springframework.ws.server.endpoint.annotation.PayloadRoot;
import org.springframework.ws.server.endpoint.annotation.RequestPayload;
import org.springframework.ws.server.endpoint.annotation.ResponsePayload;

import uy.org.softtech.cssuite.core.ServicioWeb;
import uy.org.softtech.cssuite.excepciones.EntidadNoEncontradaException;
import uy.org.softtech.cssuite.excepciones.ServicioWebException;
import uy.org.softtech.cssuite.servicios.ServiciosUsuarios;
import uy.org.softtech.cssuite.webservices.pedidos.ObtenerUsuarioRequest;
import uy.org.softtech.cssuite.webservices.respuestas.ObtenerUsuarioResponse;

@Endpoint
public class ServiciosWebUsuarios extends ServicioWeb {
	
	private Logger log = Logger.getLogger(getClass());
	
	// Servicios
	@Resource(name = "servicios-usuarios" )
	private ServiciosUsuarios serviciosUsuarios;
	
	/**
	 * Método para verificar que todos los parámetros han sido seteados correctamente.
	 * 
	 * @author fabian.lobo
	 */
	@PostConstruct
	public void initialize(){
		super.initialize();
		
		notNull(serviciosUsuarios(), "La propiedad [serviciosUsuarios] de [" + getClass().getName() + "] no ha sido establecida.");
				
		log.info("Endpoint para los servicios web relacionados con la información de los usuarios ha sido inicializado.");
	}
	
	/*
	 *  SERVICIOS
	 */
	/**
	 * Servicio para obtener la información de un usuario
	 * 
	 * @param obtenerUsuarioRequest - Payload del mensaje SOAP
	 * @return un elemento ObtenerUsuarioResponse con los datos del usuario
	 * @throws ServicioWebException si ocurre una excepción durante la ejecución del servicio
	 * @author fabian.lobo
	 * @see ObtenerUsuarioResponse
	 */
	@PayloadRoot(localPart = "ObtenerUsuarioRequest", namespace = NAMESPACE)
	@ResponsePayload
	public ObtenerUsuarioResponse procesarObtenerUsuarioRequest(@RequestPayload ObtenerUsuarioRequest obtenerUsuarioRequest) throws ServicioWebException {
		ObtenerUsuarioResponse respuesta = new ObtenerUsuarioResponse();
		try {
			respuesta.setUsuario(serviciosUsuarios().buscarUsuario(obtenerUsuarioRequest.getUsuario()));
		} catch (EntidadNoEncontradaException e) {
			log.error(e);
			throw new ServicioWebException(e.getMessage());
		}
		return respuesta;
	}

	/*
	 *  GETTERS
	 */
	public ServiciosUsuarios serviciosUsuarios() {
		return serviciosUsuarios;
	}
}
